package amani.wechat.platform.utils;

import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;

import javax.imageio.ImageIO;

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

public class CompressPic {
	/**
	 * 缩略图类（通用） 本java类能将jpg、bmp、png、gif图片文件，进行等比或非等比的大小转换
	 * @param in
	 * @return
	 * @throws IOException
	 */
	@SuppressWarnings("restriction")
	public static byte[] compressPic(InputStream in,double h,double w) throws IOException {
		Image img = ImageIO.read(in);
		// 判断图片格式是否正确
		if (img.getWidth(null) == -1) {
			System.out.println("can't read,retry!");
			return null;
		} else {
			//为等比缩放计算输出的图片宽度及高度
			double rate1 = ((double) img.getWidth(null)) / w + 0.1;
			double rate2 = ((double) img.getHeight(null)) / h + 0.1;
			// 根据缩放比率大的进行缩放控制
			double rate = rate1 > rate2 ? rate1 : rate2;
			int newWidth = (int) (((double) img.getWidth(null)) / rate);
			int newHeight = (int) (((double) img.getHeight(null)) / rate);
			BufferedImage tag = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_RGB);
			/*
			 * Image.SCALE_SMOOTH 的缩略算法 生成缩略图片的平滑度的 优先级比速度高 生成的图片质量比较好 但速度慢
			 */
			tag.getGraphics().drawImage(img.getScaledInstance(newWidth, newHeight, Image.SCALE_SMOOTH), 0, 0, null);
			// JPEGImageEncoder可适用于其他图片类型的转换
			ByteArrayOutputStream out =  new ByteArrayOutputStream();
			JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
			encoder.encode(tag);
			byte[] res =out.toByteArray();  
			out.close();
			return res;
		}
	}
}
